package day9.homeWork;

import java.util.Random;

//4.选做题目
//a.通过线程实现消费者和生产者购买商品的功能:
//定义一个类产品类：属性 产品名称   最大数量   当前数量
//       一个消费者线程类：属性 产品类对象
//       一个生产者线程类:  属性  产品类对象
//       一个测试类：初始化，运行
//要求:生产者线程，当当前数量<最大数量时候.  生产者要进行生产.提示生产数量和当前数量
//        生产结束后,提示消费者可以购买。
//        消费者线程, 消费者购买商品数量随机数而定，不能超过商品最大数量,如果购买数量大于商品当前数量.
//        需要提示 购买的数量，库存不足。   呼叫生产者开始生产物品
//        如果购买的商品数量小于商品当前数量则。正常购买 ，提示购买的数量和剩余数量
public class ChooseA {
    Product product = new Product("苹果", 100, 0);

    public static void main(String[] args) {
        ChooseA aa = new ChooseA();
        Producer p = new Producer(aa.product);
        Consumer consumer = new Consumer(aa.product);
        new Thread(p, "生产者").start();
        new Thread(consumer, "客户").start();
    }
}

class Producer extends Thread {
    Product product;

    public Producer(Product product) {
        this.product = product;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        while (true) {
            synchronized (product) {
                try {
                    if (product.nowNum < product.MaxNum) {
                        product.nowNum = product.MaxNum;
                        System.out.println(name + "生产了" + product.nowNum + "个" + product.name);
                        Thread.sleep(2000);
                    } else {
                        product.notifyAll();
                        product.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();

                }
            }
        }
    }
}

class Consumer extends Thread {
    Product product;

    public Consumer(Product product) {
        this.product = product;
    }

    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        while (true) {
            synchronized (product) {
                try {
                    Random r = new Random();
                    int buyNum = r.nextInt(product.MaxNum) + 1;

                    if (buyNum > product.nowNum) {
                        System.out.println("想购买" + buyNum + "个," + "购买失败,产品不足.");
                        product.notifyAll();
                        product.wait(1000);
                    }
                    int n = (product.nowNum -= buyNum);
                    System.out.println(name + "购买了" + buyNum + "个" + product.name + ",剩余:" + n);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class Product {
    String name;    //名称
    int MaxNum; //最大数量
    int nowNum; //库存

    public Product(String name, int maxNum, int nowNum) {
        this.name = name;
        MaxNum = maxNum;
        this.nowNum = nowNum;
    }
}